package org.framework.superutil.j2se;

import java.util.ArrayList;
import java.util.List;

/**
 * @Title: StackTraceElementUtils.java .<br>
 * @Package org.framework.superutil.j2se .<br>
 * @Description: 获取异常抛出信息工具类 .<br>
 * @author 郑成功 .<br>
 * @email a876459952@qq.com .<br>
 * @date 2018-12-6 下午12:37:20.<br>
 * @version V1.0.<br>
 */
public class StackTraceElementUtils {

	/**
	 * @Description: 获取指定类首次抛出类的位置信息 .<br>
	 * @param className 类的全名，即全路径名称.<br>
	 * @param e 抛出的异常.<br>
	 * @author 郑成功 .<br>
	 * @date 2018-12-6 下午12:37:53.<br>
	 */
	public static StackTraceElement getStackTraceElement(String className,Exception e){
		StackTraceElement[] elements = e.getStackTrace();
		return getStackTraceElement(className, elements);
	}
	
	/**
	 * @Description: 获取指定类首次抛出类的位置信息 .<br>
	 * @param className 类的全名，即全路径名称.<br>
	 * @param e 抛出的异常.<br>
	 * @author 郑成功 .<br>
	 * @date 2018-12-6 下午12:37:53.<br>
	 */
	public static StackTraceElement getStackTraceElement(String className,StackTraceElement[] elements){
		for(StackTraceElement element:elements){
			if(className.equals(element.getClassName())){
				return element;
			}
		}
		return null;
	}
	
	/**
	 * @Description: 获取指定类抛出异常的集合 .<br>
	 * @param className 类的全名，即全路径名称.<br>
	 * @param e 抛出的异常.<br>
	 * @author 郑成功 .<br>
	 * @date 2018-12-6 下午12:37:53.<br>
	 */
	public static List<StackTraceElement> getStackTraceElements(String className,Exception e){
		StackTraceElement[] elements = e.getStackTrace();
		return getStackTraceElements(className, elements);
	}
	
	/**
	 * @Description: 获取指定类抛出异常的集合 .<br>
	 * @param className 类的全名，即全路径名称.<br>
	 * @param elements 异常信息数组.<br>
	 * @author 郑成功 .<br>
	 * @date 2018-12-6 下午12:37:53.<br>
	 */
	public static List<StackTraceElement> getStackTraceElements(String className,StackTraceElement[] elements){
		List<StackTraceElement> list = new ArrayList<StackTraceElement>();
		for(StackTraceElement element:elements){
			if(className.equals(element.getClassName())){
				list.add(element);
			}
		}
		return list;
	}
	
	/**
	 * @Description: 获取指定类抛出异常的集合 .<br>
	 * @param e 抛出的异常.<br>
	 * @author 郑成功 .<br>
	 * @date 2018-12-6 下午12:37:53.<br>
	 */
	public static List<StackTraceElement> getStackTraceElements(Exception e){
		StackTraceElement[] elements = e.getStackTrace();
		return getStackTraceElements(elements);
	}
	
	/**
	 * @Description: 获取指定类抛出异常的集合 .<br>
	 * @param elements 异常信息数组.<br>
	 * @author 郑成功 .<br>
	 * @date 2018-12-6 下午12:37:53.<br>
	 */
	public static List<StackTraceElement> getStackTraceElements(StackTraceElement[] elements){
		List<StackTraceElement> list = new ArrayList<StackTraceElement>();
		for(StackTraceElement element:elements){
			list.add(element);
		}
		return list;
	}
	
	/**
	 * @Description: 获取异常消息错误执行代码语句 .<br>
	 * @param message 定义消息.<br>
	 * @param className 类全名.<br>
	 * @param e 异常.<br>
	 * @author 郑成功 .<br>
	 * @date 2018-12-6 下午12:52:31.<br>
	 */
	public static String getExceptionMessage(String message,String className,Exception e){
		StackTraceElement[] elements = e.getStackTrace();
		StackTraceElement element = getStackTraceElement(className, elements);
		StringBuffer str = new StringBuffer();
		if(element!=null){
			str.append("在[类:").append(element.getClassName());
			str.append("]调用[").append(element.getMethodName());
			str.append("方法]时，在执行第").append(element.getLineNumber());
			str.append("行代码时发生").append(message);
			str.append(",异常情况：").append(e.getMessage());
		}else{
			str.append(message).append(":").append(e.getMessage());
		}
		return str.toString();
	}
}
